/*
 * Copyright (c) 1995 - 2008 Sun Microsystems, Inc.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Sun Microsystems nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package com.meraklisina.latexeditor.wizard ;

import java.awt.Dimension ;
import java.awt.Graphics ;
import java.awt.Image ;
import java.beans.PropertyChangeEvent ;
import java.beans.PropertyChangeListener ;
import java.io.File ;

import javax.swing.ImageIcon ;
import javax.swing.JComponent ;
import javax.swing.JFileChooser ;

/* ImagePreview.java by FileChooserDemo2.java. */
public class ImagePreview extends JComponent implements PropertyChangeListener
{
    ImageIcon thumbnail = null ;

    File file = null ;

    public ImagePreview( JFileChooser fc )
    {
        this.setPreferredSize( new Dimension( 100, 50 ) ) ;
        fc.addPropertyChangeListener( this ) ;
    }

    public void loadImage( )
    {
        if( this.file == null )
        {
            this.thumbnail = null ;
            return ;
        }

        //Don't use createImageIcon (which is a wrapper for getResource)
        //because the image we're trying to load is probably not one
        //of this program's own resources.
        ImageIcon tmpIcon = new ImageIcon( this.file.getPath( ) ) ;
        if( tmpIcon != null )
        {
            if( tmpIcon.getIconWidth( ) > 90 )
            {
                this.thumbnail = new ImageIcon( tmpIcon.getImage( ).getScaledInstance( 90, -1, Image.SCALE_DEFAULT ) ) ;
            }
            else
            { //no need to miniaturize
                this.thumbnail = tmpIcon ;
            }
        }
    }

    public void propertyChange( PropertyChangeEvent e )
    {
        boolean update = false ;
        String prop = e.getPropertyName( ) ;

        //If the directory changed, don't show an image.
        if( JFileChooser.DIRECTORY_CHANGED_PROPERTY.equals( prop ) )
        {
            this.file = null ;
            update = true ;

            //If a file became selected, find out which one.
        }
        else if( JFileChooser.SELECTED_FILE_CHANGED_PROPERTY.equals( prop ) )
        {
            this.file = ( File )e.getNewValue( ) ;
            update = true ;
        }

        //Update the preview accordingly.
        if( update )
        {
            this.thumbnail = null ;
            if( this.isShowing( ) )
            {
                this.loadImage( ) ;
                this.repaint( ) ;
            }
        }
    }

    @Override
    protected void paintComponent( Graphics g )
    {
        if( this.thumbnail == null )
        {
            this.loadImage( ) ;
        }
        if( this.thumbnail != null )
        {
            int x = this.getWidth( ) / 2 - this.thumbnail.getIconWidth( ) / 2 ;
            int y = this.getHeight( ) / 2 - this.thumbnail.getIconHeight( ) / 2 ;

            if( y < 0 )
            {
                y = 0 ;
            }

            if( x < 5 )
            {
                x = 5 ;
            }
            this.thumbnail.paintIcon( this, g, x, y ) ;
        }
    }
}
